package com.dy.design_pattern_study.store_cashier_system;

import com.dy.design_pattern_study.store_cashier_system.factory.CashSuper;
import com.dy.design_pattern_study.store_cashier_system.factory.impl.CashNormal;
import com.dy.design_pattern_study.store_cashier_system.factory.impl.CashRebate;
import com.dy.design_pattern_study.store_cashier_system.factory.impl.CashReturn;

import java.util.Scanner;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-03-09
 * @Content 策略模式与简单工厂模式的结合
 * 总结：
 * 工厂模式就是通过传入的类型来创建对应的对象 --这里侧重对象的创建
 * 策略模式是通过传入的不同子类（实现类）来获取不同对象的策略（方法） --这里侧重方法的使用
 *
 * 其实两个的原理都差不多，只不过创建的东西不同（使用的东西不同）
 *
 */
public class CashContextAndFactory {

    private CashSuper cashSuper;

    //传入具体的收费策略
    public CashContextAndFactory(int type) {
        //工厂模式是创建不同的对象，策略模式是使用不同策略的方法

        //工厂模式是传入参数 可以创建不同的对象
        //策略模式是传入对象 可以使用不同的方法（策略）
        switch (type) {
            case 1:
                cashSuper = new CashNormal();
                CashFactory.showType = CashFactory.NORMAL_CHARGE;//仅作打印显示
                break;
            case 2:
                cashSuper = new CashReturn("300", "100");
                CashFactory.showType = CashFactory.RETURN_MONEY;//仅作打印显示
                break;
            case 3:
                cashSuper = new CashRebate("0.8");
                CashFactory.showType = CashFactory.REBATE_MONEY;//仅作打印显示
                break;
        }
    }

    //返利不同策略
    public double GetResult(double money) { return cashSuper.acceptCash(money);}

    //策略模式的前台
    public static void main(String[] args) {
        CashContextAndFactory context = null;

        System.out.println("*********** 欢迎进入 超市收银系统 ***********");

        System.out.println("1." + CashFactory.NORMAL_CHARGE);
        System.out.println("2." + CashFactory.RETURN_MONEY);
        System.out.println("3." + CashFactory.REBATE_MONEY);

        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("请选择对应的收费活动：");

            int inType = scanner.nextInt();

            context = new CashContextAndFactory(inType);

            System.out.println("请输入商品价格：");
            double price = scanner.nextDouble();

            System.out.println("请输入商品数量：");
            double number = scanner.nextInt();

            double totalPrices = context.GetResult(price * number);

            System.out.println("操作： " + CashFactory.showType);
            System.out.println("单价 = " + price);
            System.out.println("总价 = " + totalPrices);
            //可以把数据添加到一个集合就可以进行多次显示

            System.out.println("是否继续输入？Y/N");
            String conti = scanner.next();

            if (conti.equalsIgnoreCase("N")) {
                scanner.close();
                break;
            }
        }
    }
}
